• 在线程安全类中封装了必要的同步机制,因此客户端无须进一步采取同步措施

  • 看下面这段代码:

    1
    2
    3
    4
    5
    6
    7
    public class StatelessFactorizer implements Servlet {
    public void service(ServletRequest req, ServletResponse resp) {
    BigInteger i = extractFromRequest(req);
    BigInteger[] factors = factor(i);
    encodeIntoResponse(resp, factors);
    }
    }

    与大多数Servlet相同,StatelessFactorizer是无状态的:它既不包含任何域,也不包含对其他类中域的引用。计算过程中的临时状态仅存在于线程栈上的局部变量中,并且只能由正在执行的线程访问。访问StatelessFactorizer的线程不会影响另一个访问同一个StatelessFactorizer的线程的计算结果,因为这两个线程并没有共享状态,就好像它们都在访问不同的实例。由于线程访问无状态对象的行为并不会影响其他线程中操作的正确性,因此无状态对象是线程安全的

  • 为了确保线程安全性,“先检查后运行”和“读取-修改-写入”等操作必须是原子的。通常也将这两种操作成为复合操作:包含了一组必须以原子方式执行的操作以确保线程安全性。

  • 以关键字synchrozied来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象,静态的synchrozied方法以Class对象作为锁。